var gulp = require('gulp')
var $    = require('gulp-load-plugins')()
var del  = require('del')

var isProduction = true // 运行环境状态（true：生产环境，false：开发环境）
var destDir = './dist'  // 构建的目标目录
var version = require('./package.json').version // 版本号

/**
 * 转移文件（无需特殊处理，直接转移的文件）
 */
gulp.task('move', () => {
  var files = {
    '/element-ui/theme/index.css': '/element-ui/theme',
    '/element-ui/theme/fonts/**/*': '/element-ui/theme/fonts',
    '/plugins/**/*': '/plugins',
    '/json/**/*': '/json',
    '/templates/**/*': '/templates',
    '/favicon.ico': '/'
  }
  for (var i in files) {
    gulp.src(`./src/${i}`)
      .pipe(gulp.dest(destDir + files[i]))
  }
})

/**
 * 页面处理
 */
gulp.task('html', () => {
  var files = {
    '/*.html': '/',
    '/views/**/*.html': '/views'
  }
  for (var i in files) {
    gulp.src(`./src/${i}`)
      // 生产环境，替换vue版本
      .pipe($.if(isProduction, $.replace(/vue-(.*)\/vue.js/g, (match, p1) => {
        return `vue-${p1}/vue.min.js`
      })))
      // 生产环境，替换vue-router版本
      .pipe($.if(isProduction, $.replace(/vue-router-(.*)\/vue-router.js/g, (match, p1) => {
        return `vue-router-${p1}/vue-router.min.js`
      })))
      .pipe(gulp.dest(destDir + files[i]))
      .pipe($.connect.reload())
  }
})

/**
 * 样式处理
 */
gulp.task('styles', () => {
  gulp.src(['./src/scss/aui.scss'])
    // 生产环境，替换注释版本号
    .pipe($.if(isProduction, $.replace(/aui v(.*)/g, `aui v${version}`)))
    .pipe($.sass().on('error', $.sass.logError))
    .pipe($.autoprefixer({
			browsers: [
        '> 1%',
        'last 2 versions',
        'not ie <= 10'
      ],
			cascade: false
		}))
    .pipe($.minifyCss())
    .pipe($.concat('aui.min.css'))
    .pipe(gulp.dest(`${destDir}/css`))
    .pipe($.connect.reload())
})

/**
 * 图片处理
 */
gulp.task('images', () => {
  gulp.src(['./src/img/**/*.{gif,jpeg,jpg,png}'])
    .pipe($.if(isProduction, $.cache($.imagemin({
      'optimizationLevel': 5 // 优化等级，取值范围:0-7（默认3）
      ,'progressive': true   // 无损压缩jpg图片
      ,'interlaced': true    // 隔行扫描gif进行渲染
      ,'multipass': true     // 多次优化svg直到完全优化
    }))))
    .pipe(gulp.dest(`${destDir}/img`))
    .pipe($.connect.reload())
})

/**
 * 脚本处理
 */
gulp.task('scripts', () => {
  gulp.src(['./src/js/**/*.js'])
    .pipe($.babel({
      presets: ['es2015']
    }))
    .pipe($.if(isProduction, $.uglify()))
    .on('error', function(err) {
      $.util.log($.util.colors.red('[Error]'), err.toString())
    })
    .pipe(gulp.dest(`${destDir}/js`))
    .pipe($.connect.reload())
})

/**
 * 监听
 */
gulp.task('watch', () => {
  gulp.watch(['./src/*.html', './src/views/**/*.html'], ['html'])
  gulp.watch(['./src/scss/**/*.scss'], ['styles'])
  gulp.watch(['./src/images/**/*.{gif,jpeg,jpg,png}'], ['images'])
  gulp.watch(['./src/js/**/*.js'], ['scripts'])
})

/**
 * 本地HTTP服务
 */
gulp.task('webserver', () => {
  $.connect.server({
    'livereload': true,
    'port': 8001,
    'root': [destDir]
  })
})

/**
 * 清除
 */
gulp.task('clean', () => {
  return del([destDir])
})

/**
 * 生产环境（编译打包）
 */
gulp.task('build', ['clean'], () => {
  isProduction = true
  gulp.start(['move', 'html', 'styles', 'images', 'scripts'])
})

/**
 * 开发环境
 */
gulp.task('default', ['clean'], () => {
  isProduction = false
  gulp.start(['move', 'html', 'styles', 'images', 'scripts', 'watch', 'webserver'])
})
